const Koa = require('koa')
const Router = require('koa-router') // 注意：引入的方式
const app = new Koa()
const router = new Router()

// Koa中间件
// 1. 应用级中间件
// 匹配任何路由
app.use(async (ctx, next) => {
  console.log('1.匹配任何路由'+new Date(), ctx.url)
  await next() // 当前路由匹配完成以后继续向下匹配，不写 next 就不会继续向下匹配
  console.log(3)
})

// ctx 上下文context，包含了request和response等信息
// 配置路由
router.get('/', function(ctx, next) {
  ctx.body = 'hello koa' // 返回数据 相当于：原生里面的res.writeHead() res.end()
})

// 2. 路由级中间件
router.get('/news', async(ctx, next) => {
  console.log('3.这是一个新闻')
  await next()
  console.log(2)
})
router.get('/news', async (ctx) => {
  console.log('4.这是一个新闻')
  ctx.body = '这是一个新闻'
})

// 动态路由（动态路由里面也可以传入多个值）'/newscontent/:aid/:cid'
router.get('/newscontent/:aid', (ctx, next) => {
  // 获取动态路由的传值
  ctx.body = {
    aid: ctx.params.aid
  }
})
// 3. 错误处理中间件
app.use(async (ctx, next) => {
  console.log('2.这是一个中间件，会在匹配路由前执行')
  await next();
  if(ctx.status === 404) {
    ctx.status = 404;
    ctx.body = '这是一个404页面'
  }
  console.log(1)
})

// 作用：启动路由
app.use(router.routes()).use(router.allowedMethods())  // 可以配置也可以不配置，建议配置
// 作用：这是官方文档的推荐用法，我们可以看到router.allowedMethods()用在了路由匹配router.routes()之后，所以在当所有路由中间件最后调用，此时根据ctx.status设置response响应头

app.listen(3000, () => {
  console.log('starting at port 3000')
})
